<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        // 函数的自调用  (function(){})()    fn()

        // document.onclick = function(){}    // 是一个匿名函数，这个函数将来用户点击的时候才会被调用

        // document.onclick = fn    // 给一个函数，但是这个函数将来用户点击的时候才会被调用


        setTimeout(fn() , 10000)   // fn会立即执行，1s只会执行fn这个函数的结果(返回的这个函数)



        document.onclick = fn() ;    // 把fn执行的结果给了onclick


        function fn() {
            return function() {   // 他是真正的事件处理函数
                console.log(1);
            }
        }


        // setTimeout( f , 1000000) ;
        // console.log(1);
        // console.log(2);



        // 柯理化  
        // function sum(a , b, c) {}

        // sum(1,2,3)
        // sum(1,2,4)
        // sum(1,2,52)


        // const res = sum(1)(2)

        // res(3)
        // res(4)
        // res(52)


        // 沙箱模式   声明了变量，返回的对象(get  set)


        // 数据劫持  备份这个数据，且在这个过程中添加其他行为

        // Object.defineProperty()
        // 1 配置项

        // 2  get()   set()   实现数据劫持   
        //   set 之后添加其他行为


        const obj = {a:1 ,b:2} ;
        const res = {} ;
        Object.defineProperty(res , 'a' , {
            get() {
                console.log('访问对象的属性的时候调用这个get函数,他的值是' + obj.a);
                return obj.a
                
            } ,
            set(v) {
                obj.a = v ;
                // cb(res)    // 
            }
        })

        // cb(res)

        res.a = 10 ;

        // 原数据发生改变   -- 添加了一个属性
        obj.c = 4 ;


        console.log(res.c);  // 访问不到

    </script>
    
</body>
</html>